package router

import (
	"go_web_learn/controller"

	"github.com/gin-gonic/gin"
)

// RouterGroup  路由组 设计思想 先创建一个路由组的结构体，然后在这个结构体中嵌套一个结构体，这个结构体就是gin的路由组，然后其他路由组的方法都是在这个结构体中调用
//
// 这样做的好处是，如果你的路由组很多，那么你就可以在这个结构体中调用其他路由组的方法，这样就不用在每个路由组中都写一遍路由组的方法
type RouterGroup struct {
	*gin.RouterGroup // 这嵌套了一个结构体，
	// r *gin.Engine // 这里的r是一个结构体，在调用RouterGroup的时候，需要传入路由
}

func InitRouter() *gin.Engine {
	r := gin.Default()
	// 这里中间件的顺序就是这个理的插入顺序
	r.Use(controller.GlobalTraceNoHandle)
	r.Use(controller.GlobalErrorHandle)
	r.Use(controller.GlobalMiddleware)
	// 添加session中间件
	r.Use(controller.GlobalSession())
	setRouterV1(r)
	return r
}

func setRouterV1(r *gin.Engine) {
	v1 := r.Group("/v1")
	{
		v1.GET("/1", controller.DemoGet1)
		v1.GET("/2", controller.DemoGet2)
		v1.GET("/3", controller.DemoGet3)
		v1.GET("/4", controller.DemoGet4)
		v1.GET("/5", controller.DemoGet5)
		v1.GET("/6", controller.DemoGet6)
		v1.GET("/7", controller.DemoGet7)
		v1.GET("/8", controller.DemoGet8)
		v1.GET("/9", controller.DemoGet9)
		v1.GET("/10", controller.DemoGet10)
		v1.GET("/11", controller.DemoGet11)
		v1.GET("/path1/:u3", controller.Path1) //只匹配/t1/123
		v1.GET("/path2/*id", controller.Path2) //匹配/t1/123/123也匹配/t1
		// 反回string
		v1.GET("/base1", controller.Base1)
		// 反回xml
		v1.GET("/base2", controller.Base2)
	}

	v2 := r.Group("/v2")
	{
		v2.GET("/1", controller.Two1)
		v2.GET("/2", controller.Two2)
		v2.GET("/3", controller.Two3)
		v2.GET("/4", controller.Two4)
		v2.GET("/5", controller.Two5)
		v2.GET("/6", controller.Two6)
	}

	// 两种方法都可以添加分组中间件
	article := r.Group("/article", controller.GlobalMiddleware)
	article.Use(controller.GlobalMiddleware)
	{
		article.POST("/add", controller.BlogArticleController{}.AddArticle)
		article.GET("/list", controller.BlogArticleController{}.ListArticle)
	}

	// 事物学习
	transactionLean := r.Group("/transaction")
	{
		transactionLean.GET("/1", controller.TransactionInsert1)
		transactionLean.GET("/2", controller.TransactionInsert2)
	}

	// session学习
	sessionGroup := r.Group("/session")
	{
		sessionGroup.GET("/1", controller.SessionSet)
		sessionGroup.GET("/2", controller.SessionGet)
	}

	// session学习
	goLearnGroup := r.Group("/go_learn")
	{
		goLearnGroup.GET("/1", controller.GoLearn1)
	}
}
